package top.stmo.spring.ioc.test2;


import org.junit.Test;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import top.stmo.spring.ioc.test2.config.SpringConfig;
import top.stmo.spring.ioc.test2.dao.BookDao;
import top.stmo.spring.ioc.test2.service.BookService;

import javax.sql.DataSource;


/**
 *   -------------------------注解开发--------------------------
 *
 *   @Configuration注解用于设定当前类为配置类
 *   @ComponentScan注解用于设定扫描路径，此注解只能添加一次，多个数据请用数组格式
 *
 *   记住@Component、@Controller、@Service、@Repository这四个注解
 *   applicationContext.xml中<context:component-san/>的作用是指定扫描包路径，注解为@ComponentScan
 *   @Configuration标识该类为配置类，使用类替换applicationContext.xml文件
 *   ClassPathXmlApplicationContext是加载XML配置文件
 *   AnnotationConfigApplicationContext是加载配置类
 *
 *   @Scope("prototype")         //设置当前bean为多例,singleton（默认值,单例）prototype（非单例）
 *   @PostConstruct              //指定当前方法为当前bean的初始化方法
 *   @PreDestroy                 //指定当前方法为当前bean的销毁方法
 *
 *   自动装配基于反射设计创建对象并通过暴力反射为私有属性进行设值
 *   普通反射只能获取public修饰的内容
 *   暴力反射除了获取public修饰的内容还可以获取private修改的内容
 *   所以此处无需提供setter方法
 *
 *   @Autowired                  //按类型自动注入
 *   @Qualifier("bookDaoImpl")   //在照类中注入的基础之上再照名称注入,很少使用
 *   @Qualifier不能独立使用，必须和@Autowired一起使用
 *
 *   @Value("${jdbc.driver}")       //注入简单类型
 *
 *   @PropertySource("jdbc.properties")              //加载配置文件
 *
 *   @Import({JdbcConfig.class})                     //导入其他文件的配置,在配置类中只能写一次
 *
 *   @Bean  设置该方法的返回值作为spring管理的bean
 *
 *   第三方bean管理
 *       @bean
 *  第三方bean依赖注入
 *      引用类型:方法形参
 *      简单类型:成员变量
 *
 */
public class AppTest2 {

    public static void main(String[] args) {
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class);
        BookDao bookDao = (BookDao) context.getBean("bookDaoImpl");
        bookDao.save();
    }

    @Test
    public void test1() {
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class);
        BookService bookService = (BookService) context.getBean("bookServiceImpl");
        bookService.save();
    }

    //加载第三方bean
    @Test
    public void test2() {
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class);
        DataSource bean = context.getBean(DataSource.class);
        System.out.println(bean);
    }
}
